#include "bios.h"

/*****************************************************************************     
 * Peripheral Configurations                                                 *   
 *****************************************************************************/

void configTimer(void)
{ 
  TPM2SC=0x00; 
  TPM2MODL=0xA8;  /* Registro de modulo */
  TPM2MODH=0x61;  /* Registro de modulo */  
}

void configTimerAlarm(void)
{ 
  TPM1SC=0x4A;    /* Configuracion del timmer 31.25khz e interrupcion por 
                   * hardware */
  TPM1MODL=0x03;  /* Registro de modulo */
  TPM1MODH=0xE8;  /* Registro de modulo */  
}

void portInit(void)
{
  PTCDD_PTCDD0=0x1;
  PTCDD_PTCDD1=0x1;
  PTCDD_PTCDD2=0x1;  
  PTCD_PTCD0=0x1;
  PTCD_PTCD1=0x1;
  PTCD_PTCD2=0x1; 
}

/*****************************************************************************     
 * Interrupts                                                                *   
 *****************************************************************************/

void interrupt 7 ISR_TIMER1(void)
{     
  TPM1SC_TOF=0;  
  tickCounter++;  /* Tick counter is aumented each interruption */
  asm
  {
    TSX
    STHX goBackSP
    /* Saco el valor de H del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #hAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion hAdd */
    /* Saco el valor de SR del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */  
    LDHX #ccrAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion ccrAdd */
    /* Saco el valor de A del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */
    LDHX #aAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion aAdd */
    /* Saco el valor de X del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal  */
    LDHX #xAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion xAdd */
    /* Saco los valores a donde deberia regresar el PC */ 
    /* parte alta */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #spAddH 
    MOV  spSAddH,X+ /*Variable guardada en la direccion spAddH */
    /* Parte baja */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #spAddL 
    MOV  spSAddH,X+ /* Variable guardada en la direccion spAddL */
    TPA    
    AND #0x73 
    TAP
  }    
  alarmAction();
  goBackSP=goBackSP+6;
  fptr->u8contex=CONTEXTED;
  /* Salvar el contexto en la estructura */
  fptr->u16stackPointer=sp;
  fptr->u8aRegister=aReg;
  fptr->u8hRegister=hReg;
  fptr->u8xRegister=xReg;
  fptr->u8ccrRegister=ccrReg;
  fptr->u16goBackSP=goBackSP; 
  asm
  {
    JMP loopFor 
  } 
}

/*****************************************************************************
 * Timer 2 ISR                                                               *
 *****************************************************************************/

void interrupt 11 ISR_TIMER2(void)
{     
  TPM2SC_TOF=0;
  interruptActivateTask(&Task_b);
  asm
  {
    TSX
    STHX goBackSP
    /* Saco el valor de H del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #hAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion hAdd */
    /* Saco el valor de SR del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */  
    LDHX #ccrAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion ccrAdd */
    /* Saco el valor de A del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */
    LDHX #aAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion aAdd */
    /* Saco el valor de X del Stack */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal  */
    LDHX #xAdd 
    MOV  spSAddH,X+ /* Variable guardada en la direccion xAdd */
    /* Saco los valores a donde deberia regresar el PC */ 
    /* parte alta */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #spAddH 
    MOV  spSAddH,X+ /*Variable guardada en la direccion spAddH */
    /* Parte baja */
    PULA            /* La paso a el registro A */
    STA  spSAddH    /* Variable temporal */ 
    LDHX #spAddL 
    MOV  spSAddH,X+ /* Variable guardada en la direccion spAddL */
    TPA    
    AND #0x73 
    TAP    
  }
  alarmAction();
  goBackSP=goBackSP+6;
  fptr->u8contex=CONTEXTED;
  /* Salvar el contexto en la estructura */
  fptr->u16stackPointer=sp;
  fptr->u8aRegister=aReg;
  fptr->u8hRegister=hReg;
  fptr->u8xRegister=xReg;
  fptr->u8ccrRegister=ccrReg;
  fptr->u16goBackSP=goBackSP; 
  asm
  {
       JMP loopFor 
  } 
}